package Model;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 *
 * @author kiko
 */
public class ServerAplication {
    private ServerSocket welcomeServer;
    private ServerSocket welcomeCliente;
    private ServerList<Socket> serverList;
    private boolean isCentral = false;

    /**
     * Aqui é instanciado um thread para atender requisições de outros servidores
     * @param portServer Porta por onde o servidor se comunica com outros servidores
     * @param portClient Porta por onde o servidor se comunica com os clientes
     */
    public ServerAplication(int portServer, int portClient) {
        serverList = new ServerList();
        try {
            welcomeServer = new ServerSocket(portServer);
            welcomeCliente = new ServerSocket(portClient);
            new AtendeServer(welcomeServer, serverList).start();
            new AtendeCliente(welcomeCliente, this, serverList).start();
        } catch (IOException e) {
            System.out.println("Erro ao criar welcomeSocket");
        }
    }

    /**
     * Adiciona um novo servidor à lista de servidores conectados
     * @param IPServer
     * @param portServer 
     */
    public void conectToOtherServer(String IPServer, int portServer) {
        try {
            serverList.adicione(new Socket(IPServer, portServer));
        } catch (IOException e) {
            System.out.println("Erro ao tentar conectar");
        }
    }
    
    /**
     * Busca na lista de servidores conhecidos, aquele que tem o endereço
     * IP que corresponde ao recebido como parâmetro, e envia a mensagem
     * para este.
     * @param IPServer
     * @param message 
     */
    public void sendMessage(String IPServer, String message) {
        for (int i = 0; i < serverList.size(); i++) {
            System.out.println("Encontrado servidor " + ((Socket) serverList.get(i)).getInetAddress().toString());
            if (((Socket) serverList.get(i)).getInetAddress().toString().equals(IPServer)) {
                try {
                    DataOutputStream out = new DataOutputStream(serverList.get(i).getOutputStream());

                    out.writeBytes(message + "\n");
                    out.flush();
                } catch (IOException e) {
                    System.out.println("Erro ao tentar enviar mensagem para o servidor " + IPServer);
                }
            } else {
                System.out.println("Nenhum servidor encontrado com o IP " + IPServer);
            }
        }
    }
    
    public void warnUpdate(String fileName) {
        for (int i = 0; i < serverList.size(); i++) {
            sendMessage(serverList.get(i).getInetAddress().toString(), "FU:" + fileName + "\n");
        }
    }

    public ServerList<Socket> getServerList() {
        return serverList;
    }
}